package com.sias;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;

/**
 * @author 吴文杰
 * @version 1.0
 * @since 2023/6/14 22:38
 */
public class CglibProxyDemo {
  public static void main(String[] args) {
    Target target = new Target();

    Object proxyInstance = Enhancer.create(Target.class, (MethodInterceptor) (proxy, method, arg, methodProxy) -> {
      System.out.println("before");
      // Object invoke = method.invoke(target);  // 1. 用方法反射调用目标
      // methodProxy可以避免反射调用
      Object result = methodProxy.invoke(target, arg); // 2. 内部没有使用反射    需要目标 (spring)
      methodProxy.invokeSuper(proxy, arg);// 3. 内部没有使用反射    需要代理
      System.out.println("after");
      return result;
    });

    Target instance = (Target) proxyInstance;
    instance.foo();
  }

  static class Target {
    public void foo() {
      System.out.println("foo()");
    }
  }
}
